/**
  ******************************************************************************
  * @file           
  * @author         古么宁
  * @brief          iec104 文件传输服务头文件
  ******************************************************************************
  *
  * COPYRIGHT(c) 2019 GoodMorning
  *
  ******************************************************************************
*/
#ifndef __IEC10X_FILE__
#define __IEC10X_FILE__

#if (ENABLE_FILE_TRANS)

/// 操作标识
enum F_OPERATION {
	DIR_READ        = 1 , ///< 1(M).读目录激活
	DIR_READ_ACK        , ///< 2(S).读目录激活确认
	FILE_RD_CMD         , ///< 3(M).读文件激活
	FILE_RD_ACK         , ///< 4(S).读文件激活确认
	FILE_RD_DATA        , ///< 5(S).读文件数据传输
	FILE_RD_DATA_ACK    , ///< 6(M).读文件数据传输确认S
	FILE_WR_CMD         , ///< 7(M).写文件激活
	FILE_WR_ACK         , ///< 8(S).写文件激活确认
	FILE_WR_DATA        , ///< 9(M).写文件数据传输
	FILE_WR_DATA_ACK    , ///< 10(S).写文件数据传输确认
};


/// 主站召唤目录的附加数据包格式帧
struct dir_get {
	unsigned char type       ; ///< 附加数据包类型 ，一般为 2 ，其他表备用
	unsigned char operate    ; ///< 操作标识，@see enum F_OPERATION
	unsigned char dirID[4]   ; ///< 4 字节目录标识，低字节在前
	unsigned char dirlen     ; ///< 目录名长度
	char          dirname[1] ; ///< 不带结束符的目录名

	// time1,time2
};

/// 目录召唤确认数据包格式
struct dir_confirm_pkt {
	unsigned char type         ; ///< 附加数据包类型 ，一般为 2 ，其他表备用
	unsigned char operate      ; ///< 操作标识，此处应为 DIR_READ_ACK 
	unsigned char result       ; ///< 结果描述字，0:成功，1:失败
	unsigned char dirID[4]     ; ///< 4 字节目录标识，低字节在前
	unsigned char continuation ; ///< 后续标志，0:无后续,1:有后续
	unsigned char files        ; ///< 当前帧文件数量
	unsigned char data[1]      ; ///< 后续的文件列表 , @see struct dir_file_list
};

/// 从站目录确认中的文件描述数据包格式帧
struct dir_file_list {
	unsigned char namelen      ; ///< 文件名长度
//	unsigned char name[1]      ; ///< 文件名
	unsigned char attributes   ; ///< 文件属性，备用
	unsigned char size[4]      ; ///< 文件大小，低字节在前
	struct CP56Time2a  time    ; ///< 文件时间 
};

/// 文件激活数据包格式帧
struct file_confirm_pkt {
	unsigned char type         ; ///< 附加数据包类型 ，一般为 2 ，其他表备用
	unsigned char operate      ; ///< 操作标识
	unsigned char result       ; ///< 结果描述字，0:成功，1:失败
	unsigned char namelen      ;
	char          name[1]      ;
//	char          fID[4]       ;
//  char          fsize[4]     ;
} ;

/// 文件数据传输格式帧
struct file_data_pkt {
	unsigned char type         ; ///< 附加数据包类型 ，一般为 2 ，其他表备用
	unsigned char operate      ; ///< 操作标识
	unsigned char ID[4]        ;
	unsigned char ftell[4]     ;
	unsigned char continuation ;
	char          data[1]      ;
}  ;

/// 主站读文件激活数据包格式帧
struct read_cmd_pkt {
	unsigned char type        ;
	unsigned char option      ;
	unsigned char namelen     ;
	char          name[1]     ;
} ;

/// 主站读文件数据传输确认包格式帧
struct read_ack_pkt {
	unsigned char type        ;
	unsigned char option      ;
	unsigned char ID[4]       ;
	unsigned char ftell[4]    ;
	char          continuation;
} ; 


/**
  * @brief    iec10x 文件传输服务响应
  * @return   成功返回 0
*/
void iec10x_file_service(iec10x_t * bus , uint8_t * ASDU, int ASDUlen) ;



/**@name    回复数据确认帧模式
  * @brief  在接收到文件数据包时，什么时候回复数据确认帧
  * @{
*/
#define ACK_EACH_PACKET      0 ///< 对每包接收到的文件内容数据包都进行回复
#define ACK_WHEN_FINISH      1 ///< 仅接收结束时回复确认帧
#define ACK_SLIDING_WINDOW   2 ///< 更新滑动窗口时回复
/** @}*/

#endif /* ENABLE_FILE_TRANS */
#endif /* __IEC104_FILE__ */
